from collections import ChainMap

# 现在有多个字典或者映射，想将它们从逻辑上合并为一个单一的映射后执行某些操作，比如查找值或者检查某些键是否存在
def demo_1():
    a = {'x': 1, 'y': 2}
    b = {'z': 3, 'y': 4}
    # 在两个字典中执行查找操作（比如先从a中找，如果找不到再在b中找），可以使用ChainMap类
    c = ChainMap(a, b)
    print(c)
    print(c['x'])
    print(c['y'])
    print(c['z'])
    l = len(c)
    print(l)
    # ChainMap类只是在内部创建一个容纳这些字典的列表并重新定义了一些常见的字典操作来遍历这个列表
    l1 = list(c.keys())
    print(l1)
    l2 = list(c.values())
    print(l2)

def demo_2():
    values = ChainMap()
    values['x'] = 1
    print(values)
    # 添加一个新的映射
    values = values.new_child()
    print(values)
    values['x'] = 2
    values = values.new_child()
    values['x'] = 3
    print(values)
    print(values['x'])
    # 去掉后添加的映射
    values = values.parents
    print(values['x'])
    values = values.parents
    print(values['x'])
    print(values)

def demo_3():
    a = {'x': 1, 'z': 3}
    b = {'y': 2, 'z': 4}
    merged = ChainMap(a, b)
    print(merged)
    print(merged['x'])
    print(merged['z'])
    # 可以替换合并前的map内的元素
    a['x'] = 42
    print(merged['x'])

if __name__ == '__main__':
    # demo_1()
    # demo_2()
    demo_3()